home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / bootcode.arc / MAKEBOOT.ASM < prev    next >
Assembly Source File  |  1991-06-13  |  6KB  |  259 lines

  1. ;
  2. ;Program to make a bootable disk, set to load and run the application
  3. ;  program upon booting.
  4. ;
  5. stack    segment    para stack 'STACK'
  6.     db    64 dup('stack   ')
  7. stack    ends
  8. ;
  9. ;Note: for convenience, both the boot routine and the application program
  10. ;  are contained in a single segment.  This limits the maximum size of the
  11. ;  application program to slightly less than 64K.
  12. ;
  13. dseg    segment
  14. boot_len    equ    512    ;Maximum length of boot routine
  15. msg1    db    0dh,0ah,'File containing boot routine: $'
  16. msg2    db    0dh,0ah,'Boot routine file cannot be opened.',0dh,0ah,'$'
  17. bootname    db    15,?,15 dup(?)    ;Temporary storage for boot routine
  18.                     ; file name
  19. bootfcb    db    37 dup(?)    ;File control block for boot routine file
  20. bootbuf    db    boot_len dup(?)    ;Buffer to hold boot routine
  21. prog_len    equ    4096    ;Maximum length of application program buffer
  22.                 ; (must be a multiple of 128)
  23. msg3    db    0dh,0ah,'File containing application program: $'
  24. msg4    db    0dh,0ah,'Application program file cannot be opened.'
  25.     db    0dh,0ah,'$'
  26. progname    db    15,?,15 dup(?)    ;Temporary storage for boot routine
  27.                     ; file name
  28. progfcb    db    37 dup(?)    ;File control block for boot routine file
  29. ;
  30. ;Buffer for the application program.  The DUP factor should be large
  31. ;  enough to hold the whole program, but less than 64K.
  32. ;
  33. progbuf    db    prog_len dup(?)
  34. progend    label    byte    ;End of the program buffer
  35. ;
  36. ;Each 4-byte group describes the parameters to be used when formatting
  37. ;  a sector.  This format block is used for an 8-sector track.
  38. ;
  39. format_block    db    0,0,1,2
  40.     db    0,0,2,2
  41.     db    0,0,3,2
  42.     db    0,0,4,2
  43.     db    0,0,5,2
  44.     db    0,0,6,2
  45.     db    0,0,7,2
  46.     db    0,0,8,2
  47. msg5    db    0dh,0ah,0dh,0ah,'Insert a blank disk in drive A:.'
  48.     db    0dh,0ah,'This disk will be wiped out, so be careful!'
  49.     db    0dh,0ah,'Strike any key to begin...',7,'$'
  50. msg6    db    0dh,0ah,0dh,0ah,'The disk in drive A: is ready to boot.'
  51.     db    0dh,0ah,'$'
  52. dseg    ends
  53. ;
  54. cseg    segment
  55.     assume    cs:cseg,ds:dseg,es:dseg
  56. start    proc    far
  57.     push    ds
  58.     sub    ax,ax
  59.     push    ax    ;Set stack for return to DOS
  60. ;
  61. ;Set working data segment.
  62. ;
  63.     mov    ax,dseg
  64.     mov    ds,ax
  65.     mov    es,ax    ;Set ES for the parse filename function
  66. ;
  67. ;Get the boot routine file control block set up.
  68. ;
  69.     mov    dx,offset msg1
  70.     mov    ah,9
  71.     int    21h    ;Prompt for boot file name
  72.     mov    dx,offset bootname
  73.     mov    ah,0ah
  74.     int    21h    ;Get boot file name
  75.     mov    si,offset bootname+2    ;Skip the count bytes in bootname
  76.     mov    di,offset bootfcb
  77.     mov    al,1
  78.     mov    ah,29h
  79.     int    21h    ;Parse the filename into a file control block
  80. ;
  81. ;Open the boot routine file.
  82. ;
  83.     mov    dx,offset bootfcb
  84.     mov    ah,0fh
  85.     int    21h    ;Open it
  86.     and    al,al
  87.     jz    read_boot
  88. ;
  89. ;Error in trying to open the boot routine file.
  90. ;
  91.     mov    dx,offset msg2
  92.     mov    ah,9
  93.     int    21h    ;Notify of error
  94.     jmp    done
  95. ;
  96. ;Read in the boot record.
  97. ;The record point field is set to the top of the file (record 0) by the open.
  98. ;
  99. read_boot:
  100. ;
  101. ;First set load address.
  102. ;
  103.     mov    dx,offset bootbuf
  104.     mov    ah,1ah
  105.     int    21h
  106. ;
  107. ;Now read it.
  108. ;
  109.     mov    dx,offset bootfcb
  110.     mov    cx,boot_len/128    ;# of 128-byte records to be read
  111.     mov    ah,27h
  112.     int    21h    ;Read it as a single block
  113. ;
  114. ;Now read in the application program.
  115. ;Get the application routine file control block set up.
  116. ;
  117.     mov    dx,offset msg3
  118.     mov    ah,9
  119.     int    21h    ;Prompt for application file name
  120.     mov    dx,offset progname
  121.     mov    ah,0ah
  122.     int    21h    ;Get application file name
  123.     mov    si,offset progname+2    ;Skip the count bytes in progname
  124.     mov    di,offset progfcb
  125.     mov    al,1
  126.     mov    ah,29h
  127.     int    21h    ;Parse the filename into a file control block
  128. ;
  129. ;Open the application routine file.
  130. ;
  131.     mov    dx,offset progfcb
  132.     mov    ah,0fh
  133.     int    21h    ;Open it
  134.     and    al,al
  135.     jz    read_appl
  136. ;
  137. ;Error in trying to open the application routine file.
  138. ;
  139.     mov    dx,offset msg4
  140.     mov    ah,9
  141.     int    21h    ;Notify of error
  142.     jmp    done
  143. ;
  144. ;Read in the application program.
  145. ;The record point field is set to the top of the file (record 0) by the open.
  146. ;
  147. read_appl:
  148. ;
  149. ;First set load address.
  150. ;
  151.     mov    dx,offset progbuf
  152.     mov    ah,1ah
  153.     int    21h
  154. ;
  155. ;Now read it.
  156. ;
  157.     mov    dx,offset progfcb
  158.     mov    cx,prog_len/128    ;# of 128-byte records to be read
  159.     mov    ah,27h
  160.     int    21h    ;Read it as a single block
  161. ;
  162. ;Now write on the disk in drive A:.
  163. ;
  164. ;Warn the user first!
  165. ;
  166.     mov    dx,offset msg5
  167.     mov    ah,9
  168.     int    21h
  169. ;
  170. ;Wait for user to strike a new key to proceed.
  171. ;
  172.     mov    ax,0c01h    ;DOS function empties key buffer before
  173.     int    21h        ; reading next character
  174. ;
  175. ;Format and write the boot record via BIOS.
  176. ;
  177.     sub    dx,dx    ;Side 0, drive 0
  178.     sub    ch,ch    ;Track 0
  179.     mov    cl,1    ;Sector 1
  180.     mov    bx,offset format_block    ;Point to format parameters
  181.     mov    ah,5    ;BIOS format track function
  182.     mov    al,8    ;Format with 8 sectors
  183.     int    13h    ;Format the track
  184. ;
  185. ;Write the track.
  186. ;
  187.     sub    dx,dx    ;Side 0, drive 0
  188.     sub    ch,ch    ;Track 0
  189.     mov    cl,1    ;Start at sector 1
  190.     mov    bx,offset bootbuf    ;Take input from here
  191.     mov    ah,3    ;BIOS write sector function
  192.     mov    al,1    ;Write 1 sector
  193.     int    13h    ;Write the boot track
  194. ;
  195. ;Format and write each track of the application program in turn.
  196. ;
  197.     mov    ch,1    ;Start at track 1
  198.     mov    bx,offset progbuf    ;Point to start of application
  199.                     ; program
  200. appl_loop:
  201.     push    bx
  202.     push    cx
  203.     call    format_write_track
  204.     pop    cx
  205.     pop    bx
  206.     inc    ch    ;Point to the next track
  207.     add    bx,1000h    ;Point to the next section of program code
  208.     cmp    bx,offset progend    ;See if we're at the end of the
  209.     jb    appl_loop        ; application program buffer
  210. ;
  211. ;Notify finished.
  212. ;
  213.     mov    dx,offset msg6
  214.     mov    ah,9
  215.     int    21h
  216. ;
  217. ;Return to DOS.
  218. ;
  219. done:
  220.     ret
  221. start    endp
  222. ;
  223. ;Subroutine to format and write the data starting at DS:BX to track CH.
  224. ;
  225. format_write_track    proc    near
  226. ;
  227. ;First format the track.
  228. ;
  229.     push    bx    ;Save the data to be written address
  230.     sub    dx,dx    ;Side 0, drive 0
  231.     mov    cl,1    ;Start at sector 1
  232.     mov    bx,offset format_block    ;Point to format parameters
  233.     mov    [bx],ch    ;Set each of the format records to point to the
  234.             ; track to be formatted
  235.     mov    [bx+4],ch
  236.     mov    [bx+8],ch
  237.     mov    [bx+12],ch
  238.     mov    [bx+16],ch
  239.     mov    [bx+20],ch
  240.     mov    [bx+24],ch
  241.     mov    [bx+28],ch
  242.     mov    ah,5    ;BIOS format track function
  243.     mov    al,8    ;Format with 8 sectors
  244.     int    13h    ;Format the track
  245.     pop    bx    ;Retrieve the address of the data to be written
  246. ;
  247. ;Write the track.
  248. ;
  249.     sub    dx,dx    ;Side 0, drive 0
  250.     mov    cl,1    ;Start at sector 1
  251.     mov    ah,3    ;BIOS write sector function
  252.     mov    al,8    ;Write 8 sectors
  253.     int    13h    ;Write the track
  254. ;
  255.     ret
  256. format_write_track    endp
  257. cseg    ends
  258.     end    start    ;Program will begin at label START
  259.